package com.baoxian.task.job.datasource;

import com.jolbox.bonecp.BoneCPDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * Created with IntelliJ IDEA.
 * User: XiongNeng
 * Date: 12-11-05
 * Time: 下午4:46
 */
public class JdbcUtil {

    private static final Logger log = LoggerFactory.getLogger(JdbcUtil.class);
    private static BoneCPDataSource ds;

    /**
     * 初始化连接池(手动方式)
     */
    public static void initDataSource(String configPath) {
        try {
            if (ds == null) {
                //读取配置文件
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(new FileInputStream(configPath + "taskjobConfig.properties")));
                Properties props = new Properties();
                props.load(reader);
                reader.close();
                log.info("----第一次初始化数据库连接池----");
                // load the DB driver
                Class.forName(props.getProperty("com.baoxian.task.job.jdbc.driver"));
                // create a new datasource object
                ds = new BoneCPDataSource();
                // set the JDBC url
                ds.setJdbcUrl(props.getProperty("com.baoxian.task.job.jdbc.url"));
                // set the username
                ds.setUsername(props.getProperty("com.baoxian.task.job.jdbc.username"));
                // set the password
                ds.setPassword(props.getProperty("com.baoxian.task.job.jdbc.password"));
                // (other config options here)

                /**
                 * # 高级设置
                 #  idleConnectionTestPeriodInMinutes - 检查数据库连接池中空闲连接的间隔时间(分) 默认：240
                 #  idleMaxAgeInMinutes - 连接池中未使用的链接最大存活时间(分) 默认：240
                 #  minConnectionsPerPartition - 每个分区最小的连接数
                 #  maxConnectionsPerPartition - 每个分区最大的连接数
                 #  partitionCount - 分区数 默认值：2，最小值：1，
                 #  acquireIncrement - 连接数不够时，每次创建的新链接个数 默认值：2
                 #  statementsCacheSize - Statement实例缓存个数 默认值：0
                 #  releaseHelperThreads - 每个分区释放链接助理进程的数量 默认值：3
                    */
                ds.setIdleConnectionTestPeriodInMinutes(
                        Long.parseLong(props.getProperty("com.baoxian.task.job.idleConnectionTestPeriodInMinutes")));
                ds.setIdleMaxAgeInMinutes(
                        Long.parseLong(props.getProperty("com.baoxian.task.job.idleMaxAgeInMinutes")));
                ds.setMaxConnectionsPerPartition(
                        Integer.parseInt(props.getProperty("com.baoxian.task.job.maxConnectionsPerPartition")));
                ds.setMinConnectionsPerPartition(
                        Integer.parseInt(props.getProperty("com.baoxian.task.job.minConnectionsPerPartition")));
                ds.setPartitionCount(
                        Integer.parseInt(props.getProperty("com.baoxian.task.job.partitionCount")));
                ds.setAcquireIncrement(
                        Integer.parseInt(props.getProperty("com.baoxian.task.job.acquireIncrement")));
                ds.setStatementsCacheSize(
                        Integer.parseInt(props.getProperty("com.baoxian.task.job.statementsCacheSize")));
                ds.setReleaseHelperThreads(
                        Integer.parseInt(props.getProperty("com.baoxian.task.job.releaseHelperThreads")));
            }
        } catch (ClassNotFoundException e) {
            log.error("------初始化连接池时候Class加载异常------", e);
            closeDataSource();
        } catch (IOException e) {
            log.error("------初始化连接池时候IO异常------", e);
            closeDataSource();
        }
    }

    /**
     * 获取数据库连接
     *
     * @return 数据库连接
     */
    public static Connection getConnection() {
        try {
            return ds.getConnection();
        } catch (SQLException e) {
            log.error("------获取数据库连接错误-------", e);
            return null;
        }
    }

    /**
     * 关闭数据库连接池
     */
    public static void closeDataSource() {
        if (ds != null) {
            ds.close();
        }
    }
}
